package com.ktjiaoyu.travelaiagent.tools;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.model.ToolContext;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
@Slf4j
public class WebSearchTool {

    @Value("${travel.ai.tools.api.search-api.api-key}")
    private String apiKey;

    /**
     * 使用SearchApi执行网络搜索
     * 
     * @param query 搜索关键词
     * @return 搜索结果的字符串表示
     */
    @Tool(description = "Perform a web search using Baidu search engine.")
    public String searchWeb(@ToolParam(description = "The search query keywords.", required = true) String query
            // 如果请求传递了ToolContext，则要求所有的工具方法必须有ToolContext参数，即使你不用
            , ToolContext toolContext) {
        log.info("AI调用searchWeb工具执行搜索，关键词: {}", query);
        
        try {
            // 构建SearchAPI请求URL
            String url = "https://www.searchapi.io/api/v1/search";
            String fullUrl = StrUtil.format("{}?engine=baidu&q={}&api_key={}", url, query, apiKey);
            
            // 发送HTTP GET请求
            HttpResponse response = HttpRequest.get(fullUrl).execute();
            
            if (response.getStatus() == 200) {
                // 解析响应结果
                String responseBody = response.body();
                
                // 如果返回的是JSON格式，提取关键信息
                if (JSONUtil.isTypeJSON(responseBody)) {
                    return parseSearchResults(responseBody);
                } else {
                    // 如果不是JSON格式，直接返回响应内容
                    return responseBody;
                }
            } else {
                log.error("搜索API调用失败，状态码: {}", response.getStatus());
                return "搜索失败，状态码: " + response.getStatus();
            }
        } catch (Exception e) {
            log.error("AI调用searchWeb工具执行搜索出现异常: {}", e.getMessage());
            return "搜索过程中出现异常: " + e.getMessage();
        }
    }
    
    /**
     * 解析搜索结果，提取关键信息
     * 
     * @param jsonResponse JSON格式的搜索响应
     * @return 格式化的搜索结果字符串
     */
    private String parseSearchResults(String jsonResponse) {
        try {
            // 使用Hutool解析JSON
            cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(jsonResponse);
            
            // 构建返回结果
            StringBuilder result = new StringBuilder();
            result.append("搜索结果:\n");
            
            // 提取有机搜索结果
            if (jsonObject.containsKey("organic_results")) {
                cn.hutool.json.JSONArray organicResults = jsonObject.getJSONArray("organic_results");
                for (int i = 0; i < Math.min(3, organicResults.size()); i++) { // 只取前3个结果
                    cn.hutool.json.JSONObject item = organicResults.getJSONObject(i);
                    String title = item.getStr("title", "无标题");
                    String snippet = item.getStr("snippet", "无摘要");
                    result.append(String.format("%d. %s\n   %s\n\n", i + 1, title, snippet));
                }
            }
            
            // 提取答案框内容（如果有）
            if (jsonObject.containsKey("answer_box")) {
                cn.hutool.json.JSONObject answerBox = jsonObject.getJSONObject("answer_box");
                String answer = answerBox.getStr("answer", "");
                if (StrUtil.isNotBlank(answer)) {
                    result.append("相关信息:\n").append(answer).append("\n\n");
                }
            }
            
            return result.toString();
        } catch (Exception e) {
            log.error("解析搜索结果时出现异常: {}", e.getMessage());
            return "搜索结果解析失败: " + e.getMessage();
        }
    }
}